<?php
/**
 * 行为处理类
 *
 * @author Mo yi <root@imoi.cn>
 * @link   http://www.imoi.cn
 * @copyright Copyright &copy; 2010-2012 DuoLam Software LLC
 * @license http://www.imoi.cn/license/
 * @version $Id: dpAuthBehavior.php 1 2012-04-22 14:41:54Z Mo.yi $
 * @package db
 * @since 1.0
 */

class dpAuthBehavior extends dpComponent
{
	/**
	 * 数据库连接句柄
	 */
	protected $db;

	/**
	 * 新建立角色id
	 */
	protected $roleId;

	/**
	 * 构造方法
	 * @param object dpAuth实例
	 * @return object 返回自己类实例
	 */
	public function __construct(dpAuthRole $role)
	{
		$this->db = $role->getDb();
	}

	/**
	 * 设置角色ID
	 * @return int $id 角色ID
	 * @return object 类本身
	 */
	public function setRoleId($id)
	{
		$this->RoleId = $id;
		return $this;
	}

	/**
	 * 获取设置的角色ID
	 * @return int 组id
	 */
	public function getRoleId()
	{
		return $this->RoleId;
	}

	/*
	 * 建立指定行为
	 * 其中，模块(module)和控制器(control)为字符串型
	 * 动作(action)为数组
	 * 例子：array(
	 *			'module'  => 'news',	//指定模块
	 *			'control' => 'index',	//指定控制器
	 *			//设置要访问的动作，如果为 * 代表可以访问所有动作
	 *			//否则设置要访问的动作
	 *			'action'  => array(		
	 *				'create',
	 *				'edit',
	 *				'list',
	 *				'delete'
	 *			)
	 *		);
	 * @param string $behaviorName 行为名
	 * @param array $behavior      行为列表
	 * @return boolean 成功返回true
	 */
	public function createBehavior($behaviorName, array $behavior)
	{
		if (empty($behaviorName) || empty($behavior)) return false;

		$module = $control = $action = null;

		if (isset($behavior['module']))
			$module  = $behavior['module'];
		if (isset($behavior['control']))
			$control = $behavior['control'];
		if (isset($behavior['action'])) {
			if (is_array($behavior['action']))
				$action = implode('|', $behavior['action']);
			else if ($behavior['action'] == '*')
				$action = '*';
			else
				$action = ''; 
		}

		$data = array(
			'rid'			 => $this->getRoleId(),
			'behavior_name'  => $behaviorName,
			'access_module'  => $module,
			'access_control' => $control,
			'access_action'  => $action
		);

		$this->db->insert('{behavior}', $data);

		return true;
	}

	/**
	 * 通过行为ID移除行为
	 * @param int $id 行为ID
	 * @return boolean
	 */
	public function removeBehaviorById($id)
	{
		$this->db->delete('{behavior}', 'bid='.(int)$id);
		return true;
	}

	/**
	 * 通过角色ID移除行为
	 * @param int $id 角色ID
	 * @return boolean
	 */
	public function removeBehaviorByRid($id)
	{
		$this->db->delete('{behavior}', 'rid='.(int)$id);
		return true;
	}

	/**
	 * 通过条件移除行为
	 * @param string || array 删除条件
	 * @return boolean
	 */
	public function removeBehaviorByCd($conditions)
	{
		$this->db->delete('{behavior}', $conditions);
		return true;
	}

	/**
	 * 移除所有行为，通过in语句来删除
	 * @param string $column 字段名
	 * @param array  $value  字段值
	 * @return boolean
	 */
	public function removeBehaviorAll($column, array $value)
	{
		$this->db->delete('{behavior}', array('in', $column, $value));
		return true;
	}

	/**
	 * 获取某个行为
	 * @param int    $behaviorId  行为ID
	 * @param string $column      字段名
	 * @param string | array $conditions 条件
	 */
	public function getBehavior($behaviorId, $column = '*', $conditions = '')
	{
		if (empty($conditions))
			$where = 'bid=' . (int)$behaviorId;
		else
			$where = array('and', 'bid='.(int)$behaviorId, $conditions);
		
		return $this->db->select($column)
			   ->from('{behavior}')
			   ->where($where)
			   ->find();
	}

	/**
	 * 更新某个行为
	 * @param int $behaviorId
	 * @param array $columns 更新的字段列表
	 * @param array $params 绑定参数
	 */
	public function updateBehavior($behaviorId, $columns, $params = array())
	{
		$this->db->update('{behavior}', $columns, 'bid='.(int)$behaviorId, $params);
	}
}
?>